﻿/*! @file
********************************************************************************
<PRE>
文 件 名    : BaseChildFiles.cs
说    明    : 获取当前文件的子文件
作    者    : 汪泽然
--------------------------------------------------------------------------------
备    注    : 
--------------------------------------------------------------------------------
修改记录: 
 * 日    期    版  本    修改人    修改内容 
 * 2009-7-9    0.5.0     汪泽然    完成基本转换功能
</PRE>
********************************************************************************
* 版权所有(c) 2008 ~ 2009, 汪泽然, 保留所有权利
*******************************************************************************/
using System;
using System.Collections.Generic;
using Wangzeran.Transform.Core.TransformException;
using Wangzeran.Transform.Core.ITransform;

namespace Wangzeran.Transform.Core.Support
{
    /// <summary>
    /// 获取当前文件的子文件
    /// </summary>
    /// <remarks>
    /// 继承该类可实现获取当前文件的子文件功能
    /// 只需在继承类中实现InitChildFileInterfaces方法
    /// </remarks>
    public abstract class BaseChildFiles
    {

        /// <summary>
        /// 初始化获取子文件实现类集合
        /// </summary>
        /// <param name="lstInterface">实现类集合</param>
        /// <returns></returns>
        protected abstract void InitChildFileInterfaces(IList<IChildFile> lstInterface);


        /// <summary>
        /// 获取当前文件的子文件完整路径集合
        /// </summary>
        /// <param name="filePath">文件路径</param>
        /// <returns>子文件完整路径集合</returns>
        /// <exception cref="UnGetSubFileException">无法获取子文件的异常</exception>
        public IList<string> GetChildFiles(string filePath)
        {
            try
            {
                // 要获取的子文件的类集合
                IList<IChildFile> lstInterface = new List<IChildFile>();

                // 初始化类集合（由子类完成）
                InitChildFileInterfaces(lstInterface);

                // 获取最后的子文件集合
                return GetChildFiles(filePath, lstInterface);
            }
            catch (UnGetSubFileException ex)
            {
                throw ex;
            }
            catch (Exception ex)
            {
                throw new UnGetSubFileException(filePath, ex.Message);
            }
        }

        /// <summary>
        /// 根据相应的实现类，获取子文件
        /// </summary>
        /// <param name="filePath">文件完整路径</param>
        /// <param name="lst">获取不同类型文件的实现类，该类必须实现IChildFile接口</param>
        /// <returns></returns>
        /// <exception cref="UnGetSubFileException">无法获取子文件的异常</exception>
        private IList<string> GetChildFiles(string filePath, IList<IChildFile> lst)
        {
            try
            {
                // 子文件集合
                IList<string> lstSubFiles = new List<string>();

                // 循环要获取的类集合，获取每一种子文件
                foreach (IChildFile item in lst)
                {
                    item.GetChildFiles(filePath, lstSubFiles);
                }

                return lstSubFiles;
            }
            catch (UnGetSubFileException ex)
            {
                throw ex;
            }
            catch (Exception ex)
            {
                throw new UnGetSubFileException(filePath, ex.Message);
            }
        }
    }
}
